iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

30 天不間斷-資工隨筆大雜燴系列 第 26

[Day 26] 自己的 Shell Script 自己寫 - 函式篇

  • 分享至 

  • xImage
  •  

Shell Script 函式

語法

函式宣告

function 函式名稱()
{

}

參數

前面我們有講過參數的概念,因此當你要呼叫一個函式 假設叫 func() 的時候

func 參數1 參數2 ...

就會從檔名開始依序儲存在 position 變數(ex:$0,$1,$2...)中

回傳值

  • 數值介於 0~255 之間
  • 成功回傳0
  • 失敗回傳非0

兩種回傳值:exit, return

  • return 回傳完值之後僅終止函式
  • exit 回傳完值之後直接終止腳本

探討

我們藉由一個腳本來區別 return 和 exit 的差異

bash 腳本

     1	#!/bin/bash
     2	
     3	
     4	# return 函式
     5	retfunc()
     6	{
     7	    echo "進入 return 函式"
     8	    return 1
     9	}
    10	
    11	# exit 函式
    12	exitfunc()
    13	{
    14	    echo "進入 exit 函式"
    15	    exit 1
    16	}
    17	
    18	# 主函式
    19	retfunc
    20	echo "回傳完只有函式會消失,接着就換我 echo 了^^"
    21	exitfunc
    22	echo "不會執行到這句QAQ"

執行結果

進入 return 函式
回傳完只有函式會消失,接着就換我 echo 了^^
進入 exit 函式

我們可以發現當 return 1 完的時候,整個腳本還是在繼續運行的,因此還是可以往下執行 echo;而 exit 1 完之後,直接結束整支腳本,因此沒有執行到下方的 echo。

變數的有效範圍

函式內外的變數作用域預設都是全域型態,因此如果想要限制作用域在函式內的話需要爲變數加上 local

探討

我們寫兩個腳本來搞清楚變數在函式中是如何運作。

bash 腳本

     1	#!/bin/bash
     2	
     3	func()
     4	{
     5	 echo "進到函式中"
     6	 echo "函式內的 position 參數: $0 $1 $2"
     7	 var1="Inside"
     8	 echo "函式內的 var1:$var1"
     9	}
    10	
	
    11	echo "執行主程式"
    12	echo "函式外的 position 參數: $0 $1 $2"
    13	var1="Outside"
    14	echo "函式外的 var1:$var1"
    15	func one two
    16	echo "離開函式"
    17	echo "函式外的 var1:$var1"

執行結果:

執行主程式
函式外的 position 參數: ./variable_scope.sh one two
函式外的 var1:Outside
進到函式中
函式內的 position 參數: ./variable_scope.sh one two
函式內的 var1:Inside
離開函式
函式外的 var1:Inside

從執行結果我們可以發現,我們一開始在函式外面定義的變數是全域變數,結果進到函式之後,原本的全域變數遭到更改,因此可以得知函式中的變數屬於全域形態。

那我要怎麽限制函式內的作用域,讓函式內對於變數的改動不會影響到外面?

我們可以使用 local

     1	#!/bin/bash
     2	
     3	#函式區塊
     4	func()
     5	{
     6	 echo "進到函式中"
     7	 echo "函式內的 position 參數: $0 $1 $2"
     8	 local var1="Inside"
     9	 echo "函式內的 var1:$var1"
    10	}
    11	
    12	#主程式區塊
    13	echo "執行主程式"
    14	echo "函式外的 position 參數: $0 $1 $2"
    15	var1="Outside"
    16	echo "函式外的 var1:$var1"
    17	func one two
    18	echo "離開函式"
    19	echo "函式外的 var1:$var1"

執行結果:

執行主程式
函式外的 position 參數: ./local_variable_scope.sh  
函式外的 var1:Outside
進到函式中
函式內的 position 參數: ./local_variable_scope.sh one two
函式內的 var1:Inside
離開函式
函式外的 var1:Outside

參考資料

https://stackoverflow.com/questions/4419952/difference-between-return-and-exit-in-bash-functions
https://www.shellscript.sh/


上一篇
[Day 25] 自己的 Shell Script 自己寫 - While 迴圈
下一篇
[Day 27] 自己的 Shell Script 自己寫 - 資料重導向
系列文
30 天不間斷-資工隨筆大雜燴30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言